package com.hsc;

/**
 * @author
 * @date 2025-04-15
 * @Description 阶乘的算法实现 两种实现方式
 */
public class Code02_SumOfFactorial {

    /**
     * 计算阶乘
     * 1! = 1
     * 2! = 1 * 2 = 2
     * 3! = 1 * 2 * 3 = 6
     * 4! = 1 * 2 * 3 * 4 = 24
     * ..... 以此类推
     * n! = 1 * 2 * 3 * 4 * ... * n
     * 求和 给定一个n
     * 求出1!+2!+3!+4!+...+n!
     *
     * 第一种方法：
     * @param n
     */
    public static  void function1(int n) {
        // 对阶乘相加
        int sum = 0;
        for (int i = 1; i <= n; i++) {
            // 得到 1!、2！、3！、4！、5！、6！
            int ans = factorial(i);
            // 阶乘相加
            sum =sum + ans;
        }

        System.out.println(sum);
    }


    /**
     *  得到输入n的阶乘
     * @param n
     * @return
     */
    public static int factorial(int n){
        int ans = 1;
        // 获取1到n的阶乘
        for (int i = 1; i <= n; i++) {
            // 假设 n=6
            // i=1  sum=1 *1=1
            // i=2  sum=1 *2=2
            // i=3  sum=2 *3=6 =1* 2* 3
            // i=4  sum=6 *4=24 = 1* 2* 3* 4
            // i=5  sum=24 *5=120 = 1* 2* 3* 4* 5
            // i=6  sum=120 *6=720 = 1* 2* 3* 4* 5* 6
            ans =ans * i;
        }
        return ans;
    }

    /**
     * 方法二：优化实现 简化代码
     * @param n
     */
    public static void function2(int n) {
        // 对阶乘相加
        //  定义一个阶乘的变量
        // 定义一个阶乘想加的变量
        int sum = 0;
        int ans = 1;
        for (int i = 1; i <= n; i++) {
            // 获取1到n的阶乘
            // i=1 cur=1*1=1
            // i=2 cur=1*2=2
            // i=3 cur=2*3=6
            // i=4 cur=6*4=24
            // i=5 cur=24*5
            // i=6 cur=24*6=120 当n=6的时
            ans = ans * i;
            // 阶乘相加
            sum =sum + ans;
        }


        System.out.println(sum);
    }

    public static void main(String[] args) {
//        Code02_SumOfFactorial code02_sumOfFactorial = new Code02_SumOfFactorial();
        function1(11);
        function2(11);
    }

}
